// 题目描述
// 给定一个二进制数组 nums 和一个整数 k，如果可以翻转最多 k 个 0 ，则返回 数组中连续 1 的最大个数 。

 

// 示例 1：

// 输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
// 输出：6
// 解释：[1,1,1,0,0,1,1,1,1,1,1]
// 粗体数字从 0 翻转到 1，最长的子数组长度为 6。
// 示例 2：

// 输入：nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
// 输出：10
// 解释：[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
// 粗体数字从 0 翻转到 1，最长的子数组长度为 10。

// 自己的答案（原本是想从判断连续为 1 的字符串的思路开始出发，行不通）：
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var longestOnes = function(nums, k) {
    for (let i = 0; i < nums.length; i++) {
        const oneLength = nums.slice(i, k).filter(num => num === 1).length
    }
};

console.log(longestOnes([1,1,1,0,0,0,1,1,1,1,0], 2))

// Gpt解法：
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var longestOnes = function(nums, k) {
    let left = 0; // 左指针
    let maxCount = 0; // 最大连续1的个数
    let zeroCount = 0; // 当前窗口内的0的个数
 
    for (let right = 0; right < nums.length; right++) {
        if (nums[right] === 0) {
            zeroCount++; // 遇到0，增加zeroCount
        }
 
        // 如果当前窗口内的0的个数超过了k，需要移动左指针收缩窗口
        while (zeroCount > k) {
            if (nums[left] === 0) {
                zeroCount--; // 左指针指向0时，减少zeroCount
            }
            left++; // 移动左指针
        }
 
        // 更新最大连续1的个数
        maxCount = Math.max(maxCount, right - left + 1);
    }
 
    return maxCount;
};

// 官方解法（主要看 Gpt 解法）：
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var longestOnes = function (nums, k) {
    let maxLen = 0
    let j = 0
    for (let i = 0; i < nums.length;i++ ) {
        if (nums[i] == 0) {
            k--
        }
        while (k < 0) {
            if (nums[j] == 0) {
                k++
            }
            j++
        }
         if (i-j+1 > maxLen) {
            maxLen = i-j+1
        }
    }
    return maxLen;
};